from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
import os
from datetime import datetime

# 学历类型映射（与 Django Model 的 choices 对应）
EDUCATION_TYPE_MAP = {0: "全日制", 1: "非全日制"}


def generate_word_resume(params, save_path=None):
    """
    生成完整字段的 Word 简历，适配所有新增字段
    :param params: 前端参数，需包含 phone、name、sex、birthdate、desc、
                   first_work_time、recent_job、job_categories、company、
                   work_time_start、work_time_end、skill、work_content、
                   education_type、university、major、start_time、end_time、
                   student_experience、city、expect_job、expect_salary_start、
                   expect_salary_end、expect_job_category、advantage
    :param save_path: 简历保存路径，默认为项目根目录下的uploads文件夹
    :return: 生成结果
    """
    doc = Document()

    # 1. 基本信息（姓名、电话、性别、生日）
    name_heading = doc.add_heading(params.get("name", "未命名"), level=1)
    name_heading.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

    base_info_paragraph = doc.add_paragraph()
    base_info_paragraph.add_run(f"电话：{params.get('phone', '')}  ")
    base_info_paragraph.add_run(f"性别：{params.get('sex', '')}  ")
    base_info_paragraph.add_run(f"出生日期：{params.get('birthdate', '')}")
    base_info_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

    # 2. 自我介绍
    doc.add_heading("个人简介", level=2)
    doc.add_paragraph(params.get("desc", "无"))

    # 3. 首次工作 & 最近工作
    doc.add_heading("工作履历", level=2)
    first_work = params.get('first_work_time')
    if first_work:
        # 处理日期格式（如 "2023-07-01" -> 格式化显示）
        first_work_date = datetime.strptime(first_work, "%Y-%m-%d").strftime("%Y年%m月%d日")
        doc.add_paragraph(f"首次参加工作时间：{first_work_date}")
    doc.add_paragraph(f"最近工作职位：{params.get('recent_job', '无')}")
    doc.add_paragraph(f"就职公司：{params.get('company', '无')}")

    # 4. 在职时间
    work_start = params.get('work_time_start')
    work_end = params.get('work_time_end')
    if work_start and work_end:
        start_date = datetime.strptime(work_start, "%Y-%m-%d").strftime("%Y年%m月%d日")
        end_date = datetime.strptime(work_end, "%Y-%m-%d").strftime("%Y年%m月%d日")
        doc.add_paragraph(f"在职时间：{start_date} - {end_date}")

    # 5. 技能 & 工作内容
    doc.add_heading("技能与工作内容", level=2)
    doc.add_paragraph(f"技能：{params.get('skill')}")
    doc.add_paragraph(f"工作内容：{params.get('work_content')}")

    # 6. 教育背景
    doc.add_heading("教育背景", level=2)
    edu_type = EDUCATION_TYPE_MAP.get(params.get('education_type'))
    doc.add_paragraph(f"学历类型：{edu_type}")
    doc.add_paragraph(f"毕业大学：{params.get('university')}")
    doc.add_paragraph(f"专业：{params.get('major')}")

    # 入学 & 毕业时间
    edu_start = params.get('start_time')
    edu_end = params.get('end_time')
    if edu_start and edu_end:
        edu_start_date = datetime.strptime(edu_start, "%Y-%m-%d").strftime("%Y年%m月%d日")
        edu_end_date = datetime.strptime(edu_end, "%Y-%m-%d").strftime("%Y年%m月%d日")
        doc.add_paragraph(f"入学时间：{edu_start_date} - {edu_end_date}")

    # 7. 在校经历
    doc.add_heading("在校经历", level=2)
    doc.add_paragraph(params.get('student_experience'))

    # 8. 工作城市 & 期望职位
    doc.add_heading("求职期望", level=2)
    doc.add_paragraph(f"工作城市：{params.get('city')}")
    doc.add_paragraph(f"期望职位：{params.get('expect_job')}")
    doc.add_paragraph(
        f"期望月薪：{params.get('expect_salary_start')} - {params.get('expect_salary_end')} 元")

    # 9. 个人优势
    doc.add_heading("个人优势", level=2)
    doc.add_paragraph(params.get('advantage'))

    # 确定保存路径
    if save_path is None:
        # 获取项目根目录
        project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        uploads_dir = os.path.join(project_root, 'uploads')

        # 确保uploads目录存在
        os.makedirs(uploads_dir, exist_ok=True)

        # 生成带时间戳的文件名
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        save_path = os.path.join(uploads_dir, f"{params.get('name')}_{timestamp}.docx")
    else:
        # 使用传入的路径，确保目录存在
        os.makedirs(os.path.dirname(save_path), exist_ok=True)

    # 保存文档
    doc.save(save_path)
    return {
        "status": "success",
        "path": save_path,
        "message": "Word 简历生成成功（含所有新字段）"
    }


def recommend_jobs(analysis):
    """
    模拟根据AI分析结果推荐岗位。
    :param analysis: AI分析结果字典
    :return: 推荐岗位列表
    """
    # 这里可以根据分析内容智能推荐岗位
    skills = analysis.get("技能", [])
    if "Python" in skills:
        jobs = ["Python开发工程师", "数据分析师"]
    else:
        jobs = ["通用岗位"]
    return {
        "推荐岗位": jobs
    }


# # 示例调用（模拟前端参数）
# if __name__ == "__main__":
#     sample_params = {
#         "phone": "15314425964",
#         "name": "张三",
#         "sex": "男",
#         "birthdate": "2006-05-01",
#         "desc": "自我介绍：具备良好沟通能力，擅长团队协作...",
#         "first_work_time": "2023-07-01",
#         "recent_job": "Java 开发工程师",
#         "job_categories": "软件开发",  # 示例，可根据实际存储格式调整
#         "company": "XX 科技有限公司",
#         "work_time_start": "2023-07-01",
#         "work_time_end": "2025-06-01",
#         "skill": "Java、SpringBoot、MySQL、Git",
#         "work_content": "负责后端接口开发、系统优化...",
#         "education_type": 0,  # 全日制
#         "university": "XX 大学",
#         "major": "计算机科学与技术",
#         "start_time": "2019-09-01",
#         "end_time": "2023-06-30",
#         "student_experience": "在校参与 XX 项目开发，获得 XX 奖项...",
#         "city": "北京",  # 假设关联 City 模型的名称
#         "expect_job": "高级 Java 开发工程师",
#         "expect_salary_start": 15000,
#         "expect_salary_end": 20000,
#         "expect_job_category": "软件开发",  # 示例，根据实际调整
#         "advantage": "学习能力强、抗压能力好，有开源项目经验..."
#     }
#
#     # 调用示例1：使用默认路径（项目根目录下的uploads文件夹）
#     result = generate_word_resume(sample_params)
#
#     print(f"简历已保存至：{result['path']}，状态：{result['message']}")
#
#     # 调用示例2：指定自定义路径
#     # result = generate_word_resume(sample_params, save_path="./custom_folder/resume.docx")
#     # print(f"简历已保存至：{result['path']}，状态：{result['message']}")
